import com.mcrmb.CmdEvent;
import com.mcrmb.PayApi;
import com.mcrmb.event.McrmbPayEvent;
import com.mcrmb.event.QrDoneEvent;
import com.mcrmb.event.QrRequestEvent;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        getLogger().info("插件已载入...");
        getServer().getPluginManager().registerEvents(this,this); //注册本类为监听器
    }

    //支付监听
    @EventHandler
    public void test_pay_event(McrmbPayEvent payEvent){
        getLogger().info("----- 发生点券支付事件 -----");
        getLogger().info("玩家名："+payEvent.getPlayer());
        getLogger().info("点券数："+payEvent.getMoney());
        getLogger().info("剩余余额："+payEvent.getLatestBalance());
        getLogger().info("消费原因："+payEvent.getReason());
        getLogger().info("消费结果："+payEvent.getResponse());
        getLogger().info("是否公屏："+payEvent.isBroadcast());

    }

    //指令监听
    @EventHandler
    public void test_cmd_event(CmdEvent cmdEvent){
        cmdEvent.getCmd(); //第一个参数
        cmdEvent.getCmds(); //参数数组
        cmdEvent.getSender(); //命令发送人
        if(cmdEvent.getCmd().equalsIgnoreCase("nb")){
            // 用户执行了 /b nb xxx xxx 指令，插件处理的逻辑内容。
            getLogger().info(cmdEvent.getSender().getName()+" 执行了指令 /b "+String.join(" ",cmdEvent.getCmds()));
            cmdEvent.getSender().sendMessage("你执行了指令 /b "+String.join(" ",cmdEvent.getCmds()));

        }else if(cmdEvent.getCmd().equalsIgnoreCase("balance") && cmdEvent.getCmds().length==2){
            // 用户执行了 /b balance 玩家名
            String playername = cmdEvent.getCmds()[1];
            checkmoney(playername);
        }else if(cmdEvent.getCmd().equalsIgnoreCase("forcepay") && cmdEvent.getCmds().length==5){
            // 用户执行了 /b forcepay <玩家名> <点券数> <消费原因> <是否公屏> ，同步模式执行支付
            /**
             * 注意，正式环境下，接口应使用异步调用，这里的同步只是用来演示/b debug 功能用！
             */
            //
            // Pay(String playername,String point,String useto,boolean brocast)
            PayApi.Pay(
                    cmdEvent.getCmds()[1],
                    cmdEvent.getCmds()[2],
                    cmdEvent.getCmds()[3],
                    cmdEvent.getCmds()[4].equalsIgnoreCase("true")
            );
        }else if(cmdEvent.getCmd().equalsIgnoreCase("forcepay_async") && cmdEvent.getCmds().length==5){
            // 用户执行了 /b forcepay_async <玩家名> <点券数> <消费原因> <是否公屏> ，异步模式执行支付。
            // Pay(String playername,String point,String useto,boolean brocast)
            getServer().getScheduler().runTaskAsynchronously(this, new Runnable() {
                @Override
                public void run() {
                    PayApi.Pay(
                            cmdEvent.getCmds()[1],
                            cmdEvent.getCmds()[2],
                            cmdEvent.getCmds()[3],
                            cmdEvent.getCmds()[4].equalsIgnoreCase("true")
                    );
                }
            });
        }else if(cmdEvent.getCmd().equalsIgnoreCase("qrpaytest") && cmdEvent.getCmds().length==3){
            // 用户执行了 /b qrpay <渠道> <金额>
            qrpay((Player) cmdEvent.getSender(),cmdEvent.getCmds()[1],Integer.parseInt(cmdEvent.getCmds()[2]));
        }
    }

    //自己定义指令，本插件在plugins.yml定义了 /test
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        // 使用指令： /test <玩家名> 调用mcrmb接口查询玩家信息
        if(args.length==1){
            String playername = args[0];
            checkmoney(playername);
        }
        return true;
    }

    //调用mcrmb的方法查询玩家信息
    private void checkmoney(String playername) {
        getServer().getScheduler().runTaskAsynchronously(this, new Runnable() {
            @Override
            public void run() {
                getLogger().info("----- 查询玩家 "+playername+" 余额信息 -----");
                getLogger().info("余额："+ PayApi.look(playername));
                getLogger().info("累计消费："+PayApi.allpay(playername));
                getLogger().info("累计充值："+PayApi.allcharge(playername));
            }
        });
    }



    // 2.0b17 新增
    // 调用mcrmb的方法发起二维码支付，参数：
    // player 玩家名
    // qd 渠道 wx=微信 ali=支付宝 qq=QQ钱包
    // money 金额
    //返回：
    // ["二维码URL","订单ID"]
    private void qrpay(Player player,String qd,int money){
        //走异步
        getServer().getScheduler().runTaskAsynchronously(this, new Runnable() {
            @Override
            public void run() {
                String[] result = PayApi.RequestQr(player,qd,money);
                getLogger().info("----- 发起扫码支付请求 -----");
                getLogger().info("二维码URL："+result[0]);
                getLogger().info("订单ID："+result[1]);

                player.sendMessage("----- 发起扫码支付请求 -----");
                player.sendMessage("二维码URL： "+result[0]);
                player.sendMessage("订单ID： "+result[1]);
                player.sendMessage("网页支付： http://www.mcrmb.com/Pay?"+qd+"="+result[1]);
            }
        });
    }

    // 2.0b17 新增
    // 二维码发起事件监听
    @EventHandler
    public void test_event(QrRequestEvent qr){
        getLogger().info("----- 发生二维码请求事件 -----");
        getLogger().info("玩家名："+qr.getPlayer());
        getLogger().info("充值金额："+qr.getMoney());
        getLogger().info("支付渠道："+qr.getQd());
        getLogger().info("二维码内容："+qr.getQr());
        getLogger().info("订单ID："+qr.getId());
        getLogger().info("提示信息："+qr.getMsg());
        getLogger().info("结果（SUCCESS=成功   ERROR=失败  NETWORK=接口问题）："+qr.getResponse()); //SUCCESS = 成功   ERROR = 失败  NETWORK = 接口问题
    }

    // 2.0b17 新增
    // 扫码支付完成事件监听，注意，该事件仅在MCRMB插件内发起扫码充值后会产生。 如果你是自己调用MCRMB插件的发起二维码接口，将不会有支付完成事件。
    @EventHandler
    public void test_event(QrDoneEvent qrdone){
        getLogger().info("----- 发生支付结果检查事件 -----");
        getLogger().info("玩家名："+qrdone.getPlayer());
        getLogger().info("充值金额："+qrdone.getMoney());
        getLogger().info("充值点券："+qrdone.getPoint());
        getLogger().info("支付渠道："+qrdone.getQd());
        getLogger().info("订单ID："+qrdone.getId());
        getLogger().info("订单创建时间戳："+qrdone.getCreate_time());
        getLogger().info("订单完成时间戳："+qrdone.getDone_time());
        getLogger().info("结果（PAID=成功  UNPAID=未支付,轮询中 TIMEOUT=超过5分钟未支付）："+qrdone.getResponse()); //PAID=成功  UNPAID=未支付 TIMEOUT=超过5分钟未支付
    }
}
